# Darren
# 2025年02月19日14时25分48秒

# 交换两个数字 python独有
a, b = 1, 2
a, b = b, a
print(a, b)


# 多返回值
def return_more():
    return 1, 2  # 返回多个值，是以元组形式返回的


ret = return_more()  # 用一个变量接收-> 元组
print(ret)
print(type(ret))
ret1, ret2 = return_more()  # 用两个变量返回->自动拆包
print(ret1, ret2)


# 缺省参数：形参有默认值
# 缺省参数须在位置参数前
# def print_info(name, gender=True,title): # SyntaxError: parameter without a default follows parameter with a default
#     ...
def print_info1(name, gender=True):
    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("%s 是 %s" % (name, gender_text))


print_info1("小明")
print_info1("小美", False)


# 多个缺省参数，前面参数保持默认，传递后面参数，使用keyword型传递方式
def print_info2(name, title="", gender=True):
    """
    :param title: 职位
    :param name: 班上同学的姓名
    :param gender: True 男生 False 女生
    """
    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("%s%s 是 %s" % (title, name, gender_text))


print_info2("小红", gender=False)  # keyword参数传参


# 多值参数（可变参数）  函数参数个数不定 >=0
def demo1(num, num1, *args, **kwargs):
    # 多值参数形式：
    # *args（arguments 变量） 存放元组
    # **kwargs （keyword arguments 键值对参数）存放字典
    print(num)
    print(num1)
    print(args)
    print(kwargs)


def demo(num, *args, **kwargs):
    demo1(num, *args, **kwargs)  # 注意函数嵌套调用传参方式不变（拆包）


demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
demo(1, 2, name="小明", age=18, gender=True)  # 多值参数个数可为0


# 函数递归 找关于n的递推公式 F(n) = f(n-1) + 结束条件
def f(n):
    if n == 1:  # 结束条件写在return前
        return 1
    return n + f(n - 1)


# 如果有 n个台阶，每次只能走 1个，或者 2个台阶
# 到第 n 个台阶有多少种走法？
def step(n):
    if n == 1 or n == 2:
        return n
    return step(n - 1) + step(n - 2)


n = step(5)
print((n))
# step(10000)  # 函数栈溢出 RecursionError: maximum recursion depth exceeded
